A storage service provider owns a set of servers to store and manage user data in a storage system. In most cases, the set of servers tend to be overprovisioned. The service providers allocate significantly more resources then are really needed to serve a given workload. FIG. 2 shows an example of such overprovisioning, where a number of jobs 1, 2 and 3 are provisioned over machines M1, M2 and M3. Portions of each job are completed by different machines, or workers (alternatively referred to as nodes). Each job requires a particular amount of effort to complete and each machine has limited performance. As a result, a jobs-to-machine schedule is sometimes created, where the minimal length schedule is referred to as a “makespan”. Such behavior of a storage system is generally predefined during software development. In fact, some behavioral aspects of the storage system are enforced directly in source code. When the system is in operation, receiving requests and assigning jobs to workers, the behavior cannot be modified in real-time. Instead, the original source code must be modified and deployed in order to change the operation of the storage system.
Often, developers who develop the software of the storage system and operators of a data center are different individuals with different duties and objectives. Accordingly, having developers involved in constantly changing code based on current states of the system would unnecessarily comingle the duties and requirements of software developers and Data Center operations (DCO) personnel. Conversely, DCOs being involved in software development is also unfeasible. Therefore, the system should be designed in a way as to respond to requests, whether they be storage requests, or otherwise, based on current system status and constraints without the need to redesign the entire system.